#ifndef MINIDISCRETECURVE_H
#define MINIDISCRETECURVE_H

#include "MiniObject.h"
#include "MiniBSplineCurve.h"

namespace XYF
{
    /**
     * @file: MiniDiscreteCurve.h
     * @author: xingyifan
     * @date: 2023-03-15 23:12
     *
     * @description: 离散曲线：由有序离散点连接成的曲线，包含规范化到 [0,1] 上的参数值
     */

    class MiniDiscreteCurve : public MiniObject
    {
    public:
        MiniDiscreteCurve(const MiniArray<Vector3f> &points, const MiniArray<Real> &t);

        // 重载返回类型
        virtual int GetType() override;

        int GetPointsNum() const;                       // 获得顶点数
        const MiniArray<Vector3f> &GetPoints() const;   // 获得顶点数组的引用
        MiniArray<Vector3f> &GetPoints();               // 获得顶点数组
        const Vector &GetPara() const;                  // 获得参数值的引用
        Vector &GetPara();                              // 获得参数值

        MiniBSplineCurve *FittingCurve(int N, int d) const;             // 标准化参数 t，用 N 个控制点的 d 次 B 样条曲线拟合
        MiniBSplineCurve *LSPIACurve(int N, int d, Real tol) const;     // 基于几何迭代法的曲线拟合

    protected:
        Vector m_t;                     // 保存参数值
        MiniArray<Vector3f> m_points;   // 保存点的数组
    };
}

#endif // MINIDISCRETECURVE_H
